#include <vector>
#include <fstream>
#include <iostream>

using namespace std;

struct Point {
  int x;
  int y;
};

struct Rect {
  Point bl; // bottom left
  Point tr; // top right

  int area() {
    // 作业:
    // 在这里计算由 bl 和 tr 构成的矩形的面积并返回
    return (tr.y - bl.y) * (tr.x - bl.x);
  }

  bool cover(Point pt) {
    // 作业
    // 判断参数 pt 是否包含在由 bl 和 tr 所包围的矩形里
    // 是返回 true，否则返回 false
    return (pt.x >= bl.x && pt.y >= bl.y) && (pt.x <= tr.x && pt.y <= tr.y);
  }
};

int main(int argc, char const *argv[])
{
  /* code */
  // 作业1:
  // 根据题目要求从文件中读入 4 个点的坐标，生成对应的 Point 对象
  int x1 = 0, y1 = 0, x2 = 0, y2 = 0, x3 = 0, y3 = 0, x4 = 0, y4 = 0;
  
  ifstream ifs("BlockedBillboard.in");

  ifs >> x1 >> y1 >> x2 >> y2; // 除草机
  ifs >> x3 >> y3 >> x4 >> y4;

  // 作业2:
  // 根据得到的 Point 对象生成表示除草机和牛饲料广告牌的 Rect 对象
  Rect lawnmowerRect {
    {x1, y1}, // Point
    {x2, y2}  // Point
  };

  Rect foodRect {
    {x3, y3},
    {x4, y4}
  };

  Point tl { x1, y2 }; 
  Point bl { x1, y1 }; 
  Point tr { x2, y2 }; 
  Point br { x2, y1 }; 

  // 作业3:
  // 判断除草机和牛饲料广告牌的遮挡情况
  int cornersCovered = 0;

  if (foodRect.cover(tl)) { ++cornersCovered; }
  if (foodRect.cover(bl)) { ++cornersCovered; }
  if (foodRect.cover(tr)) { ++cornersCovered; }
  if (foodRect.cover(br)) { ++cornersCovered; }

  // 当除草机广告牌一个角被遮住的情况
  int area = 0;

  if (cornersCovered == 1) {
    // cornersCovered == 0
    area = lawnmowerRect.area();
  }

  // 当除草机广告牌两个角被遮住的情况
  if (cornersCovered == 2) {
    Rect covered {
      {
        // 左下角
        max(lawnmowerRect.bl.x, foodRect.bl.x),
        max(lawnmowerRect.bl.y, foodRect.bl.y)
      },
      {
        // 右上角
        min(lawnmowerRect.tr.x, foodRect.tr.x),
        min(lawnmowerRect.tr.y, foodRect.tr.y)
      }
    };

    area = lawnmowerRect.area() - covered.area();
  }

  // 当除草机广告牌四个角被遮住的情况
  if (cornersCovered == 4) {
    area = 0;
  }

  ofstream ofs("BlockBillboard.out");
  ofs << area;

  return 0;
}

